//
//  XFRForNonRestricted.h
//  OCSEngine
//
//  Created by byf on 2022/10/26.
//  Copyright © 2022 Tencent. All rights reserved.
//

#ifndef OCSENGINE_RFIX_RFIX_FOR_NON_RESTRICTED_H_
#define OCSENGINE_RFIX_RFIX_FOR_NON_RESTRICTED_H_

// ⚠️ NOTE: 本文件中的 API 仅限 RFIX NR (Nonrestricted)版本用户使用。
// RFIX 普通版没有这些 API 的实现，强行使用会编译失败。

#import <RFIX/RFIXBuildConfig.h>

#if TARGET_OS_IPHONE
#import <UIKit/UIKit.h>
#define RFIXImage UIImage
#elif TARGET_OS_OSX
#import <AppKit/AppKit.h>
#define RFIXImage NSImage
#endif

#if !RFIX_BUILD_CONFIG_IS_NONRESTRICTED
#error "'RFIXNonRestricted.h' is only for RFIX NR Version. 该文件仅供 RFIX NR 版本使用，RFIX 普通版本请不要 import 该文件"
#endif  // RFIX_BUILD_CONFIG_IS_NONRESTRICTED

#if RFIX_BUILD_CONFIG_IS_NONRESTRICTED
#pragma mark - RFIX Load API
// 加载 RFIX 补丁
//
// 注意：
// 建议一次性加载所有补丁，并且在整个 App 生命周期中仅调用一次 RFIXLoad
// 多次调用 RFIXLoad 加载相同的 ObjC Class 的补丁是一个未定义行为
//
// 参数：
// |rootPath| 为补丁根目录绝对路径
// |fileNames| 为补丁文件相对|rootPath|的相对路径，注意文件名不需要包含 ".64.ocs" 或 ".32.ocs" 后缀
//
// 返回值：
// Error Code
// 0： 加载成功
// 非 0： 加载失败
//
// 例如：
// 在 sandbox/Document 目录下有 "FooBar.64.ocs", "BarBaz.64.ocs" "XXXViewController.64.ocs" 三个补丁文件
// 则可调用:
// NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
// NSUInteger errorCode = RFIXLoad(rootPath, @[@"FooBar", "BarBaz", "XXXViewController"]);
// if (errorCode == 0) {
//    // 加载补丁成功
// } else {
//    // 加载失败
// }
// 即可加载补丁
RFIX_EXPORT NSUInteger RFIXLoad(NSString *rootPath, NSArray *fileNames);

#pragma mark - Plugin API

/**
 仅 RFIXObfusForQQNEWS 版本（新闻）支持 Plugin API。
 其他版本 RFIX SDK 没有 Plugin API 的对应实现，请不要调用！
 */

// 用于检测是否有 RFIXLoadResourcePackForPlugin 接口的宏
#define RFIX_HAS_LOAD_RESOURCE_PACK_FOR_PLUGIN_API 1

// 尽量不要在符号表中出现 plugin 关键字，以免出现审核问题
#define RFIXLoadResourcePackForPlugin RFIXLoadResourcePack2

/// NOTE: 该接口有两个名字 RFIXLoadResourcePack2 或 RFIXLoadResourcePackForPlugin,
/// 建议使用 RFIXLoadResourcePackForPlugin, 以更好的表达该接口的用途。
/// RFIXLoadResourcePackForPlugin 是宏定义, 以避免 plugin 关键字出现在符号表中

/// 加载插件 zip 包, 需要在 RFIXSDKStart 之后调用
/// 可调用多次, 可加载多个插件包, 与 RFIX 热更新补丁不冲突.
/// 同步接口，函数返回即代表插件加载成功或失败(详见返回值).
/// 使用场景：业务方使用非 RFIX 平台下发插件(补丁)zip 包，可以使用该接口手动加载插件(补丁)
/// Note: 业务方使用非 RFIX 下发插件(补丁)时，下发的 zip 需要加密, 客户端下载后要校验 zip 合法性,
///       以避免被审查以及被中间人攻击.
/// Note: 传入该接口的 zip 文件需要先由业务方解密.
/// @param pluginZipPath 插件 zip 包绝对路径
/// Note: 必须是一个合法的*没有加密*的 zip 文件.
/// @param checkBundleIDAndVersion  true:   zip 包中根目录的 Version.json 必须和 RFIXSDKStart 时传入的信息一致
///                                 false： 不检查 Version.json
/// Note: Version.json 必须位于 zip 包根目录
/// Note: 如果没有 Version.json, 则无论 |checkBundleIDAndVersion| 为 true 或 false, 都*不会*检查.
/// @return 加载错误码, 0 为加载成功，非 0 加载失败.
/// 具体错误码详见 https://iwiki.woa.com/pages/viewpage.action?pageId=971971559
RFIX_EXPORT NSUInteger RFIXLoadResourcePack2(NSString *pluginZipPath, BOOL checkBundleIDAndVersion);

/// 获取插件中的图片资源，支持 @1x @2x @3x（内部使用 initWithContentsOfFile:）
/// @param pluginBundleName 插件 Version.json 中的 resourceName
/// @param resource 图片资源名字，需要加上图片类型扩展名！（如：001.jpg/002.JPEG/002.png）
RFIX_EXPORT RFIXImage * RFIXPluginAssetsImageNamed(NSString *pluginBundleName, NSString *resource);


/// 获取插件中的资源文件
/// @param pluginBundleName 插件 Version.json 中的 resourceName
/// @param resource 资源名字
/// @param type 资源扩展名
RFIX_EXPORT NSString * RFIXPluginAssetsPathForResource(NSString *pluginBundleName, NSString *resource, NSString *type);
#endif  // RFIX_BUILD_CONFIG_IS_NONRESTRICTED

#endif // OCSENGINE_RFIX_RFIX_FOR_NON_RESTRICTED_H_
